/**************************************************************************/ /**
* @file     load_file.h
* @brief    拷贝图片素材 SD -> SPI-Flash -> SDRAM
* @version  V3.2
* @date     2022.03.08
******************************************************************************/
#ifndef __LOAD_FILE_H__
#define __LOAD_FILE_H__

//======================================头文件依赖=====================================//
#include "main.h"
#include "file_table.h"

//======================================全局宏定义=====================================//
// SDRAMM_BASE 			=> 		0x80 000 000
#define SIZE_32MB 				(0x02000000)
#define SIZE_16MB 				(0x01000000)
#define SIZE_8MB 				(0x00800000)
#define SIZE_1MB 				(0x00100000)
#define SIZE_512KB 				(0x00080000)
#define SIZE_256KB 				(0x00040000)
#define SIZE_128KB 				(0x00020000)
#define SIZE_64KB 				(0x00010000)
#define SIZE_32KB 				(0x00008000)
#define SIZE_1KB 				(0x00000400)

#define SDRAMM_SIZE 			SIZE_8MB // SDRAM 大小 = 8 MB

/* 检查边界: user_cur 是否超过 user_over
 * example : if (CHECK_BOUNDARY_USER_OVER(sdram_handle.user_addr_over, sdram_cur)) { ......; }
 */
#define CHECK_BOUNDARY_USER_OVER(user_over, user_cur) 		( ( (user_cur) > (user_over) ) ? true : false )

/* 测试地址对齐
 * parameters type :  sdram_cur  ->  [uint8_t] < sdram_cur
 * example : sdram_handle.cur = KEEP_LCD_ALIGNMENT(sdram_handle.cur);
 */
#define KEEP_LCD_ALIGNMENT(sdram_cur) 						( (0 != ( (sdram_cur) & 0xFF ) ) ? ( ( (sdram_cur) + 0x100 ) & (~0xFF) ) : sdram_cur )

//======================================类型声明=====================================//
typedef struct {
	const uint32_t user_addr_start;	 //用户区起址
	const uint32_t user_addr_over;	 //用户区终址

	volatile uint32_t cur;			  //用户指针当前操作地址
	volatile uint32_t reloading_addr; //用户区重复加载区分界线
} mem_sdram_t;// SDRAM 内存管理

//======================================全局变量=====================================//
extern volatile mem_sdram_t SDRAM_Handle; // SDRAM 操作句柄

//======================================函数声明=====================================//
/**
 * @brief 	开机挂载文件系统及加载部分素材
 * @param 	\
 * @retval	0 - success     非0 - error
 * @note	\
 */
uint8_t loading_file(void);

/**
 * @brief 	将 Flash 的文件资源加载至 SDRAM 内
 * @param 	file_type  - 待加载文件类型, 详见(file_type_t)
 *			file_index - 待加载文件在文件列表中的索引
 *			sdram_addr - 加载至 SDRAM 的起始地址
 * @retval	0 - success     非0 - error
 * @note	该函数会改变 SDRAM_Handle.cur 的值
 */
uint8_t load_user_source_to_lvgl(uint8_t file_type, uint16_t file_index, uint32_t sdram_addr);

/**
 * @brief 	加载图片素材组
 * @param	img_index  - 图片组在文件列表中的起始索引
 *			group_size - 组大小
 *			sdram_addr - 加载至 SDRAM 的起始地址
 * @retval	0 - success     非0 - error
 * @note	该函数会改变 SDRAM_Handle.cur 的值
 */
uint8_t load_user_img_group_to_lvgl(uint16_t img_index, uint16_t group_size, uint32_t sdram_addr);

/**
 * @brief	应用 LVGL label 控件在屏幕上显示错误提示语
 * @param	flag - LVGL 自带标志，如：LV_SYMBOL_STOP 等
 *			text - 错误提示文本，可着色、仅支持英文
 * @retval	/
 * @note	阻塞显示
 */
void lvgl_show_error(const char *flag, const char *text);

#endif //__LOAD_FILE_H__
